From: Fredrik Larsson Date: Sun, 10 Sep 2017 18:41:12 +0000 (+0200) Subject: Make it possible to uninstall multiple packages X-Git-Tag: archive/raspbian/0.35.0-2+rpi1~3^2^2^2^2^2^2^2~22^2~5^2~20^2~4 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=67a07ff8387df1397186d518b46dcff00ef098c6;p=cargo.git Make it possible to uninstall multiple packages --- diff --git a/src/bin/uninstall.rs b/src/bin/uninstall.rs index 2adf2d041..3774f0c31 100644 --- a/src/bin/uninstall.rs +++ b/src/bin/uninstall.rs @@ -13,14 +13,14 @@ pub struct Options { #[serde(rename = "flag_Z")] flag_z: Vec, - arg_spec: String, + arg_spec: Vec, } pub const USAGE: &'static str = " Remove a Rust binary Usage: - cargo uninstall [options] + cargo uninstall [options] ... cargo uninstall (-h | --help) Options: @@ -49,7 +49,9 @@ pub fn execute(options: Options, config: &mut Config) -> CliResult { &options.flag_z)?; let root = options.flag_root.as_ref().map(|s| &s[..]); - ops::uninstall(root, &options.arg_spec, &options.flag_bin, config)?; + let specs = options.arg_spec.iter().map(|s| &s[..]).collect::>(); + + ops::uninstall(root, specs, &options.flag_bin, config)?; Ok(()) } diff --git a/src/cargo/ops/cargo_install.rs b/src/cargo/ops/cargo_install.rs index 4c88e8951..01189bc61 100644 --- a/src/cargo/ops/cargo_install.rs +++ b/src/cargo/ops/cargo_install.rs @@ -557,10 +557,53 @@ pub fn install_list(dst: Option<&str>, config: &Config) -> CargoResult<()> { } pub fn uninstall(root: Option<&str>, - spec: &str, + specs: Vec<&str>, bins: &[String], config: &Config) -> CargoResult<()> { let root = resolve_root(root, config)?; + let scheduled_error = if specs.len() == 1 { + uninstall_one(root, specs[0], bins, config)?; + false + } else { + let mut succeeded = vec![]; + let mut failed = vec![]; + for spec in specs { + let root = root.clone(); + match uninstall_one(root, spec, bins, config) { + Ok(()) => succeeded.push(spec), + Err(e) => { + ::handle_error(e, &mut config.shell()); + failed.push(spec) + } + } + } + + let mut summary = vec![]; + if !succeeded.is_empty() { + summary.push(format!("Successfully uninstalled {}!", succeeded.join(", "))); + } + if !failed.is_empty() { + summary.push(format!("Failed to uninstall {} (see error(s) above).", failed.join(", "))); + } + + if !succeeded.is_empty() || !failed.is_empty() { + config.shell().status("\nSummary:", summary.join(" "))?; + } + + !failed.is_empty() + }; + + if scheduled_error { + bail!("some packages failed to uninstall"); + } + + Ok(()) +} + +pub fn uninstall_one(root: Filesystem, + spec: &str, + bins: &[String], + config: &Config) -> CargoResult<()> { let crate_metadata = metadata(config, &root)?; let mut metadata = read_crate_list(&crate_metadata)?; let mut to_remove = Vec::new();